package mysql

import (
	"crypto/md5"
	"encoding/hex"
	"errors"
	"fmt"
	"my_chat/dao/redis_m"
	"my_chat/model"
	"my_chat/pkg/jwt"
	"strings"
)

const (
	secret = "jxl"
)
// 对传递过来的密码进行加密
func encryptPassword(oPassword string) string {
	h := md5.New()
	h.Write([]byte(secret))
	return hex.EncodeToString(h.Sum([]byte(oPassword)))
}

// token加密
func MD5Encode(data string) string {
	h := md5.New()
	h.Write([]byte(data))
	cipherStr := h.Sum(nil)
	return  strings.ToUpper(hex.EncodeToString(cipherStr))
}

// 判断用户是否存在
func IsUserExits(mobile string) bool {
	var count int
	db.Model(&model.User{}).Where("mobile = ?", mobile).Count(&count)
	if count >0{
		return true
	}
	return false
}

func FindUserByMobile(mobile string) uint {
	user := new(model.User)
	db.Select("id").Where("mobile = ?", mobile).First(user)
	return user.ID
}

func GetUserById(userId int64) (data interface{}, err error) {
	user := new(model.User)
	err = db.Where(&model.User{ID: uint(userId)}).First(&user).Error
	if err!=nil{
		return nil, err
	}
	return user, nil
}


func CreateUser(p *model.User) (data interface{}, err error) {
	// 通过count是否大于0，判断是否有数据
	status := IsUserExits(p.Mobile)
	if status{
		return nil, errors.New("数据已经存在数据")
	}

	p.Passwd = encryptPassword(p.Passwd)
	fmt.Println(p.Passwd)
	db.Create(p)
	return *p,nil
}

func Login(p *model.UserLogin) (data interface{}, err error) {
	// 通过count是否大于0，判断是否有数据
	user := new(model.User)
	db.Where("mobile = ?", p.Mobile).First(user)
	if *user != (model.User{}){
		if user.Passwd != encryptPassword(p.Passwd){
			return nil, errors.New("密码错误")
		}

		// jwt token
		token, err := jwt.GenToken(int64(user.ID), user.Mobile)
		if err != nil {
			return nil, errors.New("生成jwt token错误")
		}
		user.Token = token
		db.Save(user)

		// 设置登入信息到user_hash
		if err=redis_m.SetAuthSinglePoint(int64(user.ID), token);err!=nil{
			fmt.Println(err.Error())
			return nil, err
		}

		return *user, nil
	}
	return nil, errors.New("不存在该用户")

}
